package br.gov.dataprev.treinamento.ejb.service.impl;

import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;

import br.gov.dataprev.treinamento.ejb.modelo.Cliente;
import br.gov.dataprev.treinamento.ejb.modelo.Pedido;
import br.gov.dataprev.treinamento.ejb.modelo.SituacaoPedido;
import br.gov.dataprev.treinamento.ejb.service.local.FreteService;
import br.gov.dataprev.treinamento.ejb.service.remote.PedidoServiceRemote;

//(mappedName=PedidoServiceRemote.EJB_NAME)
public class PedidoServiceImpl implements PedidoServiceRemote {
	
	@EJB
	private FreteService freteService;
	
//	@EJB
//	private PedidoDaoLocal pedidoDao;
//	
//	@EJB
//	private ProdutoDaoLocal produtoDao;
	
	//@Resource (mappedName="java:jboss/mail/LojaMail")
	//private Session mySession;
	
	public void validarNovoPedido(Pedido pedido) throws Exception {
		if(pedido.getFormaPagamento() == null)
			throw new Exception("Informe a forma de pagamento.");
		
		if(pedido.getItens() == null || pedido.getItens().size() == 0)
			throw new Exception("O Carrinho está vazio");
		
		if(pedido.getCliente() == null)
			throw new Exception("Cliente não informado");
	}
	
	public Pedido finalizarPedido(Pedido pedido) throws Exception {
		
		pedido.setSituacao(SituacaoPedido.AGUARDANDO_CONFIRMACAO_PGTO);
		pedido.setDataCadastro(new Date());
		pedido.setValorFrete(freteService.calcularFrete(pedido));
		validarNovoPedido(pedido);
		
		//TODO persistir pedido
		//TODO processar pagamento
		//TODO enviar email de confirmação
		
		return pedido;
		
	}
	
	public Pedido cancelarPedido(Pedido pedido) {
		
		//TODO obter do banco
		
		switch (pedido.getSituacao()) {
		
		case AGUARDANDO_CONFIRMACAO_PGTO:
			pedido.setSituacao(SituacaoPedido.CANCELADO);
			break;
			
		case CONFIRMADO:
		case PRONTO_ENVIO:
			pedido.setSituacao(SituacaoPedido.CANCELADO);
			//TODO providenciar extorno do pagamento
			break;
			
		case ENVIADO_TRANSPORTADORA:
		case ENTREGUE:
			pedido.setSituacao(SituacaoPedido.CANCELADO);
			//TODO solicitar devoluçao
			break;
			
		case CANCELADO:
			//TODO nao faz nada
		}
		
		//TODO persiste o pedido;
		
		return pedido;
	}
	
	
	public Pedido obterPedido(Long id) {
		return null;
	}
	
	public List<Pedido> obterPedidos(Cliente c) {
		return null;
	}
	
	private void enviarEmail(String to, String subject, String body) throws AddressException, MessagingException{
//		Message message = new MimeMessage(mySession);
//		message.setFrom(new InternetAddress("leoeri@gmail.com"));
//		Address toAddress= new InternetAddress(to);
//		message.addRecipient(Message.RecipientType.TO, toAddress);
//		message.setSubject(subject);
//		message.setContent(body, "text/plain");
//		Transport.send(message);
	}
	
	public void incluir(Pedido pedido) {
		//TODO delegar ao Dao
	}

	public void excluir(Pedido pedido) {
		//TODO delegar ao Dao
	}
	
	public void alterar(Pedido pedido) {
		//TODO delegar ao Dao
	}
	
	public Pedido obterCliente(Long id){
		//TODO delegar ao Dao
		return null;
	}
	
}
